//
//  WaterFlowLayout.m
//  LessonUICollectionView
//
//  Created by lanou on 16/3/8.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import "WaterFlowLayout.h"

@interface WaterFlowLayout ()
// item的总个数
@property (nonatomic, assign) NSInteger numberOfItems;
// 记录每一列当前的高度
@property (nonatomic, strong) NSMutableArray *heightOfColumns;
// 记录每一个所有的item的属性（x，y, width, height）
@property (nonatomic, strong) NSMutableArray *atttibutes;
// 得到最短列的索引
- (NSInteger)indexOfShortestHeight;
// 得到最长列的索引
- (NSInteger)indexOfLongestHeight;
// 计算每一个item的位置
- (void)calculatePositionOfItems;

@end

@implementation WaterFlowLayout


#pragma mark - 懒加载
- (NSMutableArray *)heightOfColumns
{
    if (!_heightOfColumns) {
        self.heightOfColumns = [NSMutableArray array];
    }
    return _heightOfColumns;
}

- (NSMutableArray *)atttibutes
{
    if (!_atttibutes) {
        self.atttibutes = [NSMutableArray array];
    }
    return _atttibutes;
}

// 获取最长列的索引
- (NSInteger)indexOfLongestHeight
{// 先假设最高的高度为0, 记录最高高度的索引
    CGFloat heightest = 0;
    NSInteger heightestIndex = 0;
    for (int i = 0; i < self.numberOfColumns; i++) {
        // 得到当前列的高度
        CGFloat currentHeight = [self.heightOfColumns[i] floatValue];
        if (currentHeight > heightest) {
            heightest = currentHeight;
            heightestIndex = i;
        }
    }

    return heightestIndex;

}

// 获取最短列的下标
- (NSInteger)indexOfShortestHeight
{
    // 先假定最短的高度为一个值
    CGFloat shortestHeight = MAXFLOAT;
    // 用来记录最短列的索引
    NSInteger shortestIndex = 0;
    for (int i = 0; i < self.heightOfColumns.count; i++) {
        // 得到当前列的高度
        CGFloat currentHeight = [self.heightOfColumns[i] floatValue];
        if (currentHeight < shortestHeight) {
            shortestHeight = currentHeight;
            shortestIndex = i;
        }
    }
    return shortestIndex;
}

// 布局每一个item
- (void)calculatePositionOfItems
{
    // 1.得到所有item的个数
    self.numberOfItems = [self.collectionView numberOfItemsInSection:0];
    // 2.计算item的有效宽度
    CGFloat width = self.collectionView.frame.size.width - self.sectionInset.left - self.sectionInset.right;
    // 3.计算item之间的空隙
    self.itemSpacing = (width - self.itemSize.width * self.numberOfColumns) / (self.numberOfColumns - 1);
    // 4.得到每一列的初始化高度，也就是每一列第一行起始的y坐标
    for (int i = 0; i < self.numberOfColumns; i++) {
        self.heightOfColumns[i] = @(self.sectionInset.top); // @()把基本的数据类型转化为NSNumber类型
    }
    // 5.计算每一个item的位置属性
    for (int i = 0; i < self.numberOfItems; i++) {
        // 设置item的NSIndexPath
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        // 得到item的高度
        CGFloat height = 0;
        if ([_delegate respondsToSelector:@selector(waterFlowLayout:heightForItemAtIndexPath:)]) {
            height = [self.delegate waterFlowLayout:self heightForItemAtIndexPath:indexPath];
        }
        //6. 获取最短列的索引
        NSInteger shortestIndex = [self indexOfShortestHeight];
        // 7.计算item的x和y
        CGFloat x = self.sectionInset.left + (self.itemSize.width + self.itemSpacing) *shortestIndex;
        CGFloat y = [self.heightOfColumns[shortestIndex] floatValue];
        // 8.计算item的属性
        UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        attribute.frame = CGRectMake(x, y, self.itemSize.width, height);

        // 9.把item属性放入到数组中
        [self.atttibutes addObject:attribute];
        // 10.更新数组中当前列的高度
        self.heightOfColumns[shortestIndex] = @(y + height + self.itemSpacing);


    }
}


#pragma mark - 重写系统方法
#pragma mark - 准备布局
- (void)prepareLayout
{
    [super prepareLayout];
    // 计算item的位置
    [self calculatePositionOfItems];

}
// 得到contentSize的大小
- (CGSize)collectionViewContentSize
{
    // 得到之前的contentSize的大小
    CGSize contentSize = self.collectionView.contentSize;
    // 得到最长列的下标
    NSInteger heightestIndex = [self indexOfLongestHeight];
    // 得到最长列的高度
    CGFloat height = [self.heightOfColumns[heightestIndex] floatValue];
    // 更新contentSize的高度
    contentSize.height = height;

    // 返回新的contentSize
    return contentSize;
}
#pragma  mark - 返回每一个item的布局
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return self.atttibutes;
}

@end
